/**
 * AJAX  - Класс обмена сообщениями с сервером
 * 
 * @classDescription Класс обмена сообщениями с сервером
 * @constructor  
 */
function CAJAX(parentClass) 
{
	/**
	 * @type CAJAX
	 */
	var thisCAJAX 	= this;
	/**
	 * @type CMainMessagesWindow
	 */
	var parentClass = parentClass;
	var useMethod 	= 1;
	var variableName= undefined;
	var refreshTime = 2000;
	var ajaxphpfile = 'ajax_unit.php';
	var queryArray 	= new Array();
	var messages	= new Array();
	var queryIsRun 	= false;
	var useEncoding	= false;

	/**
	 * Конструктор класса
	 */
	this.__CAJAX = function () 
	{
	};
	
	/**
	 * Устанавливает метод обмена сообщениями
	 */ 
	this.setMethod = function(Method) 
	{
		if (Method == 1) {
			Method = 1;
		}else{
			Method = 0;		
		};
	};

	/**
	 * Запускает таймер до начала следующего обмена
	 */
	this.startQueryTimer = function () 
	{
		setTimeout(variableName + ".makeQuery()", refreshTime);
	};

	/**
	 * Установка запроса в очередь 
	 */
	this.MakeAJAXQuery = function(action, dopparams, callback, callbackParam) 
	{
	
		for (var i=0; i<queryArray.length; i++) {
			if ((action == queryArray[i].action)&&(action == "GetNewMessages")) {
				return undefined;
			};
		};
	
		var params = {action:undefined};
		params.action = (action != undefined) ? action : "test"; 
	
		if (dopparams != undefined) {
			for (var property in dopparams) {
				params[property] = dopparams[property];
			}
		}
		
		//Очередь на отправку...
		queryArray[queryArray.length] = {action: action, params: params, callback: callback, callbackParam : callbackParam};
	};

	/**
	 * Постановка в очередь отправки сообщений
	 */
	this.addMessageForSend = function(mesFor, mesText) 
	{
		messages[messages.length] = {mesFor : mesFor, mesText : mesText};
	};
	
	/**
	 * Вызывается при получении новых сообщений
	 */
	var resevedNewMessages = function(xml) 
	{
		var messages = $('new_messages > message', xml);
		var currentElement = undefined;
		var allMessagesIDs = "";
		
		if (messages.length == 0) {
			return undefined;
		}
		
		AddLogMessage('Ajax query return: ' + messages.length + ' new messages');
		
		for (var i=0; i<messages.length; i++) {
			currentElement = messages.eq(i);
			parentClass.newMessage(currentElement.attr('uin'),currentElement.text());
			allMessagesIDs = allMessagesIDs + currentElement.attr('id') + ",";
		}
		
		allMessagesIDs = allMessagesIDs.slice(0, -1);
		thisCAJAX.MakeAJAXQuery("newDeliveredMessages", {MessagesIDs : allMessagesIDs});
	};
	
	/**
	 * Функция вызываемая из "makeQuery" и раздающая результат запроса всем кто стоял в очереди
	 */ 
	var callBackFunction = function (strInput) 
	{
		//var xml = (useEncoding) ? : $(decryptRC4Str("_my_super_puper_key_", strInput)) : strInput;
		var xml = strInput;
		
		var oldqueryArray = new Array();
		
		for (var i=0; i<queryArray.length; i++) {
			oldqueryArray[i] = queryArray[i];
		}
		// TODO Возможный косяк
		// Обнуляем все очереди.... хоя может это надо делать и не тут.... =(
		queryArray 	= new Array();
		messages	= new Array();
		
		for (var i=0; i<oldqueryArray.length; i++) {
			if (oldqueryArray[i].callback != undefined) {
				oldqueryArray[i].callback(xml, oldqueryArray[i].callbackParam);
			};
		};
		
		queryIsRun = false;
	};

	/**
	 * Вызывается из таймера. Обработка очереди и посылка запроса серверу  
	 */
	this.makeQuery = function() 
	{
		if (queryIsRun) { // Уже запущено, бум ждать
			AddLogMessage("Query had already run");
			this.startQueryTimer();
			return;
		}
		
		this.MakeAJAXQuery("GetNewMessages", undefined, resevedNewMessages);
		
		// Очередь пустая...
		if ((queryArray.length == 0) && (messages.length == 0)) {
			this.startQueryTimer();
			return undefined;
		}

		var params = {actions: "", qerydate:GetCurrentDate()};
		var ParamsCount=0;
		
		// Если есть что делать, то делаем 
		if (queryArray.length != 0) {
			for (var i=0; i<queryArray.length; i++) {
				ParamsCount = i+1;
				var dopParams = queryArray[i].params;
	
				for (var property in dopParams) {
					if (property == "action") {
						params.actions = params.actions + dopParams.action + ",";
					}else{
						params["P"+i+"__"+property] = dopParams[property];
					}
				}
			}
		}
		// Если есть сообщения для отправки, то отправляем 
		if (messages.length != 0) {
			params["P"+ParamsCount+"__messCount"] = messages.length;
			params.actions = params.actions + "newMessagesForSend,"; 
			for (var i=0; i<messages.length; i++) {
				params["P"+ParamsCount+"__mestext_"+i] = messages[i].mesText;
				params["P"+ParamsCount+"__mesfor_"+i] = messages[i].mesFor;
			}
		}

		params.actions = params.actions.slice(0, -1);
		
		// Если только одно действие о приеме новых сообщений, то не выводим его в лог 
		if ((params.actions != "GetNewMessages")&&(params.actions != "GetUserContactList,GetNewMessages")) {
			AddLogMessage('Ajax query: ' + params.actions);
		}
		
		queryIsRun = true;
		// AJAX request
		if (useMethod == 1) {
			var val = $.get(ajaxphpfile, params, callBackFunction);
		} else {
			var val = $.post(ajaxphpfile, params, callBackFunction);
		};
		
		this.startQueryTimer();		
	};

	/**
	 * Инициализация таймера
	 */
	this.startTimer = function(variableNameIn, refreshTimeIn /* = 2 */) 
	{
		if (variableNameIn == undefined) {
			AddLogMessage('Undefined variable name! Timer not started!');
			return;		
		}
		// Установим время обновления, если было передано в параметре
		if(refreshTimeIn != undefined) {
			refreshTime = refreshTimeIn;
		}
		
		variableName = variableNameIn;
		this.makeQuery(); // Делает запрос и устанавливает таймер на повтор 
	};
	
	/**
	 * Установка времени обновления таймера
	 */
	this.setRefreshTime = function(time) 
	{
		refreshTime = time;
	};

	// Вызов конструктора 	
	this.__CAJAX();
};
